package com.woniuxy.service.impl;

import com.woniuxy.entity.CustomizationMessage;
import com.woniuxy.entity.SessionMessages;
import com.woniuxy.service.AIService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.*;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Author: 马宇航
 * @do： 专门处理AI的服务
 * @DateTime: 25/08/28/星期四 10:54
 * @Component: 成都蜗牛学苑
 **/
@Service
public class AIServiceImpl implements AIService {
    @Autowired
    ChatModel chatModel;
    @Resource
    RedisTemplate<String,String> redisTemplate;
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Override
    public Flux<String> streamAI(SessionMessages message) {
        rabbitTemplate.convertAndSend("","work_queue",message);
        List<String> list = new ArrayList<>();
        //1.先把之前的AI的消息和新的用户消息缓存到 redis中
        for (CustomizationMessage messageMessage : message.getMessages()) {
            //判断消息是user就new UserMessage封装
            if("user".equals(messageMessage.getRole())){
                String userMessage =
                        """
                        {"role":"user","content":"%s"}
                        """.formatted(messageMessage.getContent());
                list.add(userMessage);
            }else if ("ai".equals(messageMessage.getRole())){
                String assistantMessage =
                        """
                        {"role":"assistant","content":"%s"}
                        """.formatted(messageMessage.getContent());
                list.add(assistantMessage);
            }else if("system".equals(messageMessage.getRole())){
                String systemMessage =
                        """
                        {"role":"system","content":"%s"}
                        """.formatted(messageMessage.getContent());
                list.add(systemMessage);
            }else {
                System.out.println("其他没有情况");
            }
        }
        String key = "history::" + message.getSessionId() + "::" + message.getUserId();
        //redis存储用户和system消息
        redisTemplate.opsForList().rightPushAll(key , list);
        //之前的历史还没取出来，因为前端发的只是最新的2条消息。 发送给ai的消息，是全消息还是部分消息？如果list超过了200条？这个就是历史上下文问题
        //先不考虑上下文 token消耗问题，每次发送全部
        List<String> historyMessage= redisTemplate.opsForList().range(key, 0, -1);
        //不使用单一字符串来发送问话，而使用List<Message>封装的历史消息，和AI进行对话。
        Flux<String> stream = chatModel.stream(historyMessage.toString());
        //AI回复的消息也要使用redis缓存起来。用什么解构存储好一点？List，key里面包含会话ID，用户ID
        /*
        *  redis里面存储的结构：
        * <role:user,content:msg>
        *  <role:assistance,content:ai_msg>
        *  <role:user,content:msg>
        *  <role:assistance,content:ai_msg>
        */
        return stream;
    }
}
